/*******************************************************************************
  * 文件：NetComm_Typedefine.h
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：网络通信数据类型
*******************************************************************************/
#ifndef __NETCOMM_TYPEDEFINE_H
#define __NETCOMM_TYPEDEFINE_H

/* 头文件 *********************************************************************/
#include "NetComm_Constant.h"
#include "OS_Queue.h"
#include "OS_Timer.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
// 网络通信协议包
typedef struct
{
    U8 u8Length;                                          // 帧长
    U8 au8ReserveBytes[U8_NETCOMM_PKT_RSRV_BYTES_LEN];    // 保留字节
    U8 u8Cmd;                                             // 命令
    U8 au8Data[U8_NETCOMM_PKT_DATA_LEN];                  // 数据（包括校验字节）
} NetCommPacket_ts;

// 通信状态
typedef enum
{
	eNETCOMM_STATE_IDLE,      // 空闲
    eNETCOMM_STATE_HEADER,    // 帧头
    eNETCOMM_STATE_LENGTH,    // 帧长
    eNETCOMM_STATE_BODY,      // 帧体（包括保留字节，命令，数据和校验）
	eNETCOMM_STATE_END,       // 结束
} NetCommState_te;

// 通信控制
typedef struct
{
    NetCommState_te eState;      // 状态
    NetCommPacket_ts sPacket;    // 接收包
    U8* pu8Byte;                 // 字节指针
    U8 u8ByteCount;              // 字节计数
    U8 u8LastByte;               // 上一个字节
	Bool bWaitAck;               // 等待应答
    U8 u8AckCmd;                 // 响应命令
    U8 u8SentTimes;              // 发送次数
} NetCommSendControl_ts;//发送通信控制

typedef struct
{
    NetCommState_te eState;      // 状态
    NetCommPacket_ts sPacket;    // 接收包
    U8 *pu8Byte;                 // 字节指针
    U8 u8ByteCount;              // 字节计数
    U8 u8LastByte;               // 上一个字节
} NetCommRecvControl_ts;// 通信接收控制

// 网络通信结构体
typedef struct
{
    void (*pfSendByte)(U8 u8Byte);     // 发送字节
    U8 (*pfRecvByte)(void);            // 接收字节
    void (*pfClearError)(void);        // 清除错误
    void (*pfTxIrqCtrl)(Bool on);      // 发送中断控制
    NetCommSendControl_ts sSendControl;// 发送控制
    NetCommRecvControl_ts sRecvControl;// 接收控制
    NetCommPacket_ts sSendPacket;      // 待发送数据包
    NetCommPacket_ts sRecvPacket;      // 待处理数据包
    Queue_ts sSendQueue;               // 发送队列
    Queue_ts sRecvQueue;               // 接收队列
    NetCommPacket_ts asSendBuffer[U8_NETCOMM_SEND_QUEUE_SIZE];    // 发送缓冲区
    NetCommPacket_ts asRecvBuffer[U8_NETCOMM_RECV_QUEUE_SIZE];    // 接收缓冲区
    Timer_ts sSendTimer;    		   // 发送定时器
    Timer_ts sCheckStatusTimer;        // 检查状态定时器
    Timer_ts sRptAlarmStatusTimer;     // 汇报报警状态定时器
    Timer_ts sRptDevStatusTimer;       // 汇报设备状态定时器
    Timer_ts sRptBigDataTimer;         // 汇报大数据定时器
} NetComm_ts;

// 消息处理
typedef struct
{
    U8 u8Cmd;
    void (*pfHandler)(U8* pu8MsgData);
} NetCommMsgHandler_ts;

/* 变量定义 *******************************************************************/
/* 函数声明 *******************************************************************/


#endif    /*** #ifndef __NETCOMM_TYPEDEFINE_H ***/
